package delphorm.web.controller;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;

import delphorm.entite.personne.Utilisateur;
import delphorm.entite.questionnaire.InstanceQuestion;
import delphorm.entite.questionnaire.InstanceQuestionnaire;
import delphorm.entite.questionnaire.InstanceReponse;
import delphorm.entite.questionnaire.InstanceReponseOuverte;
import delphorm.entite.questionnaire.Question;
import delphorm.entite.questionnaire.Questionnaire;
import delphorm.entite.questionnaire.Reponse;
import delphorm.entite.questionnaire.ValeurFichier;
import delphorm.entite.questionnaire.ValeurNumerique;
import delphorm.entite.questionnaire.ValeurTexte;
import delphorm.web.taglibs.Toolz;




public class ModifierInstanceQuestionnaire extends SaisirInstanceQuestionnaire {
	
	private InstanceQuestionnaire instanceQuestionnaire;
	
	protected Object formBackingObject(HttpServletRequest request) throws Exception {
		//		récupère le formulaire dans la session
		Object formulaire = request.getSession().getAttribute("formulaire");
		
		if(formulaire == null)
		{
			//récupere l'instance de questionnaire 
			String numInstanceQuestionnaire = request.getParameter("numeroinstancequestionnaire");
			//TODO exception si null
			setInstanceQuestionnaire(serviceQuestionnaire.getInstanceQuestionnaireParId(new Long(numInstanceQuestionnaire)));
			//TODO exception si null 
			//TODO vérifier que le questionnaire a le droit d'être rempli
			
			//fixe le questionnaire
			setQuestionnaire(getInstanceQuestionnaire().getQuestionnaire());
			request.getSession().setAttribute("questionnaire",questionnaire); //permet d'être utilisé par la JSP
			
			//récupère l'utilisateur 
			Utilisateur auteur = (Utilisateur)request.getSession().getAttribute("utilisateur");
			//pas besoin de vérification: l'intercepteur a deja fait ce boulot
			this.setAuteur(auteur);
			
			
			//génere le bean de formulaire
			formulaire = genererFormulaireFromQuestionnaire(questionnaire);
			//le remplir
			remplirFormulaireFromInstanceQuestionnaire(getInstanceQuestionnaire(),formulaire);
		}
		return formulaire;
	}

	private void remplirFormulaireFromInstanceQuestionnaire(InstanceQuestionnaire instanceQuestionnaire, Object formulaire) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		
		
		//Mettre l'état à Créé
		String nomMethod = "setEtat";
		Class[] params = {Character.class};
		Method method = formulaire.getClass().getMethod(nomMethod,params);
		Object[] args = {new Character('C')};
		method.invoke(formulaire,args);
		
		
		Iterator itInstanceQuestions = instanceQuestionnaire.getInstancesQuestion().iterator();
		//pour chaque instance de question
		while(itInstanceQuestions.hasNext())
		{
			InstanceQuestion instanceQuestion = (InstanceQuestion)itInstanceQuestions.next();
			Question question = instanceQuestion.getQuestion();
			
			/*//si la question n'a qu'une et une seule réponse possible, 
			//il n'y a qu'une propriété pour toutes les réponses
			if(Toolz.getTypeControl(question).equals("radio"))
			{
				String nomPropriete = "radio_reponse_question_"+question.getPlace();
				bg.addProperty(nomPropriete,Integer.class);
			}*/
			
			
			
			Iterator itInstanceReponse = instanceQuestion.getInstancesReponse().iterator();
			//pour chaque réponse
			while(itInstanceReponse.hasNext())
			{				
				InstanceReponse instanceReponse = (InstanceReponse)itInstanceReponse.next();
				Reponse reponse = instanceReponse.getReponse();
				
				//cas répopnse radio
				if(Toolz.getTypeControl(question).equals("radio"))
				{
					nomMethod = "setRadio_reponse_question_"+question.getPlace();
					Class[] param = {Integer.class};
					method = formulaire.getClass().getMethod(nomMethod,param);
					Object[] arg = {reponse.getCode()};
					method.invoke(formulaire,arg);
				}
				
				//cas de reponse numerotee
				if(Toolz.getTypeControl(question,reponse).equals("liste"))
				{
					nomMethod = "setPlace_reponse_question_"+question.getPlace()+"_"+reponse.getCode();
					Class[] param = {Integer.class};
					method = formulaire.getClass().getMethod(nomMethod,param);
					Object[] arg = {instanceReponse.getNumeroOrdre()};
					method.invoke(formulaire,arg);
				}
			
				else if(Toolz.getTypeControl(question).equals("checkbox"))
				{
					nomMethod = "setCheckbox_reponse_question_"+question.getPlace()+"_"+reponse.getCode();
					Class[] param = {Integer.class};
					method = formulaire.getClass().getMethod(nomMethod,param);
					Object[] arg = {reponse.getCode()};
					method.invoke(formulaire,arg);
				}
				//TODO else exception
				
				if(reponse.getType().equals("ouverte"))
				{	
					InstanceReponseOuverte instanceReponseOuverte = (InstanceReponseOuverte)instanceReponse;
				
					if(reponse.getTypeDeDonnees().equals(new Character('N')))
					{
						nomMethod = "setReponseouvertenumerique_question_"+question.getPlace()+"_"+reponse.getCode();
						Class[] param = {Double.class};
						method = formulaire.getClass().getMethod(nomMethod,param);
						ValeurNumerique valeur = (ValeurNumerique)instanceReponseOuverte.getValeur();
						Object[] arg = {valeur.getValeur()};
						method.invoke(formulaire,arg);
					}
					else if(reponse.getTypeDeDonnees().equals(new Character('T')))
					{
						nomMethod = "setReponseouvertetexte_question_"+question.getPlace()+"_"+reponse.getCode();
						Class[] param = {String.class};
						method = formulaire.getClass().getMethod(nomMethod,param);
						ValeurTexte valeur = (ValeurTexte)instanceReponseOuverte.getValeur();
						Object[] arg = {valeur.getValeur()};
						method.invoke(formulaire,arg);
					}
					else if(reponse.getTypeDeDonnees().equals(new Character('F')))
					{
						nomMethod = "setReponseouvertefichier_question_"+question.getPlace()+"_"+reponse.getCode();
						Class[] param = {byte[].class};
						method = formulaire.getClass().getMethod(nomMethod,param);
						ValeurFichier valeur = (ValeurFichier)instanceReponseOuverte.getValeur();
						Object[] arg = {valeur.getFichier()};
						method.invoke(formulaire,arg);
						
						nomMethod = "setReponseouvertenomfichier_question_"+question.getPlace()+"_"+reponse.getCode();
						param[0] = String.class;
						method = formulaire.getClass().getMethod(nomMethod,param);
						arg[0] = valeur.getNomFichier();
						method.invoke(formulaire,arg);
						
						nomMethod = "setReponseouvertefilename_question_"+question.getPlace()+"_"+reponse.getCode();
						method = formulaire.getClass().getMethod(nomMethod,param);
						arg[0] = valeur.getFilename();
						method.invoke(formulaire,arg);
					}
					//TODO else exception
				}
			}
		}
	}

	public InstanceQuestionnaire getInstanceQuestionnaire() {
		return instanceQuestionnaire;
	}

	public void setInstanceQuestionnaire(InstanceQuestionnaire instanceQuestionnaire) {
		this.instanceQuestionnaire = instanceQuestionnaire;
	}

	protected InstanceQuestionnaire getInstanceQuestionnaireFromFormulaire(Object formulaire, Questionnaire questionnaire, Utilisateur auteur) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		InstanceQuestionnaire instanceQuestionnaire = super.getInstanceQuestionnaireFromFormulaire(formulaire, questionnaire,auteur);
		instanceQuestionnaire.setId(getInstanceQuestionnaire().getId());
		return instanceQuestionnaire;
	}

}
